/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXPoint;
import jp.ize.ux.states.UXRingState;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.UXMouseEvent;
import jp.ize.ux.acts.RingAct;
// }}}
// {{{ class UXRingBoxCoState
class UXRingBoxCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * フォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * ハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXRingBoxExclusiveState
/**
 * UXRingBoxの各種状況を表現します。
 */
enum UXRingBoxExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXRingBoxCoState );
}
// }}}
// {{{ class UXRingBoxState extends UXRingState
class UXRingBoxState extends UXRingState
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new( center : UXPoint, radius : Float )
	{
		super( center, radius );
	}
	// }}}
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるオブジェクトです。デフォルトはnullです。
	 */
	public var background(default, default) : UXObject;
	// }}}
	// {{{ public var condition( default, default) : UXRingBoxExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXRingBoxExclusiveState;
	// }}}
}
// }}}
// {{{ class UXRingBox extends UXComponent
/**
 * UXRingBoxクラス.<br>
 * Ringレイアウトと背景を持つコンポーネントです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXRingBox extends UXComponent
{
	// {{{ properties

	// プライベート変数
	private var _state : UXRingBoxState;

	// }}}
	// {{{ public var ctrl(default, default) : UXController<UXRingBoxState>;
	/**
	 * このBox内でのインタラクションを管理するコントローラークラスのインスタンスです。
	 */
	public var ctrl(default, default) : UXController<UXRingBoxState>;
	// }}}
	// {{{ public function new
	/**
	 * コンストラクタです。
	 */
	public function new( r : Float )
	{
		super();
		// 実装例
		_state = new UXRingBoxState( new UXPoint(0,0), r );
		_state.target = this;
		ctrl = new UXController<UXRingBoxState>( _state );
		ctrl.addInteraction (new RingRotateInteraction() );
		ctrl.addInteraction (new RingShownInteraction());
	}
	// }}}
	// {{{ public function setBackground( back : UXObject ) : Void
	/**
	 * 背景となるオブジェクトを設定できます。
	 */
	public function setBackground( back : UXObject ) : Void
	{
	}
	// }}}
	// {{{ public function addChild( c : UXObject ) : Void
	/**
	 * addChild オーバーライドメソッドです。引数として受け取った子オブジェクトを追加し、
	 * このコンポーネントの状態やコントーラーに反映させます。
	 */
	public override function addChild( c : UXObject ) : Void
	{
		//実装例
		super.addChild( c );
		_state.children.push( c );
		ctrl.addChild( c );
	}
	// }}}
	// {{{ public function removeChild( c : UXObject ) : Void
	/**
	 * removeChild オーバーライドメソッドです。引数として受け取った子オブジェクトを削除し、
	 * このコンポーネントの状態やコントローラーに反映させます。
	 */
	public override function removeChild( c : UXObject ) : Void
	{
	}
	// }}}
	// {{{ public function update( updator : UXRingBoxState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXRingBoxState -> Void ) : Void
	{
		updator( _state );
	}
	// }}}
	// just for demo.
	#if flash10
	// {{{ public override function setRotationX(rx : Float)
	public override function setRotationX(rx : Float)
	{
		super.setRotationX(rx);
		for (c in _state.children) {
			c.rotationX = - rx;
		}
		return rx;
	}
	// }}}
	#end
}
// }}}
// {{{ class RingRotateInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRotateInteraction クラス<br>
 * Ringの回転を表すインタラクションクラスです。
 */
class RingRotateInteraction extends UXInteraction<UXRingBoxState>
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		name = "RingRotateInteraction";
		//実装例
		judge = function (s) return true;
		addAct( (new RingAct()).rotate(3.0, Math.PI/2 ) );
	}
	// }}}
}
// }}}
// {{{ class RingShownInteraction extends UXInteraction<UXRingBoxState>
class RingShownInteraction extends UXInteraction<UXRingBoxState>
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		name = "RingShownInteraction";
		//実装例
		judge = function (s) return true;
	}
	// }}}
}
// }}}
// {{{ class UXRingBoxInitInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRingBoxInitInteraction クラス<br>
 * リングボックスのデフォルト初期化インタラクションです。
 */
class UXRingBoxInitInteraction extends UXInteraction<UXRingBoxState>
{
}
// }}}
// {{{ class UXRingBoxLayoutInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRingBoxLayoutInteraction クラス<br>
 * 円上に子コンポーネントを配置するデフォルトインタラクションです。
 */
class UXRingBoxLayoutInteraction extends UXInteraction<UXRingBoxState>
{
}
// }}}
// {{{ class UXRingBoxResizeInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRingBoxResizeInteraction クラス<br>
 * 大きさを変更するデフォルトインタラクションです。
 */
class UXRingBoxResizeInteraction extends UXInteraction<UXRingBoxState>
{
}
// }}}
// {{{ class UXRingBoxEnableInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRingBoxEnableInteraction クラス<br>
 * 有効/無効を切り替えるデフォルトインタラクションです。
 */
class UXRingBoxEnableInteraction extends UXInteraction<UXRingBoxState>
{
}
// }}}
// {{{ class UXRingBoxVisibilityInteraction extends UXInteraction<UXRingBoxState>
/**
 * UXRingBoxVisibilityInteraction クラス<br>
 * 表示/非表示に対するインタラクションです。
 */
class UXRingBoxVisibilityInteraction extends UXInteraction<UXRingBoxState>
{
}
// }}}
